package com.zsrt.javaweb.ch01;

import java.util.Arrays;
import java.util.List;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

/**
 * 怎么把一个类声明为一个切面?
 * step1: 需要把这个类纳入到spring ioc容器的管理  @Component
 * step2: 需要把这个类声明为一个切面 @Aspect
 * step3: 需要告诉spring invokeBeforeMethod这个方法需要在哪些类的哪些方法开始之前执行
 * 		  @Before注解 用来说明该方法是一个前置通知[在目标方法开始之前执行]
 * 		  切点表达式
 * step4: 在applicationContext.xml中增加配置使得前置通知@Before起作用
 * 
 * step5: 如何接收到方法的参数 Joinpoint jp
 * 
 * @author scott
 *
 */

@Component
@Aspect
public class LoggingAspect {
	
	/**
	 * 在方法之前执行
	 * 方法的访问修饰符public
	 * 方法的返回值int
	 * 方法所在的包名com.zsrt.javaweb.ch01
	 * 方法所在的类名ArithmeticCalculateImpl或者接口名ArithmeticCalculate
	 * 方法名add
	 * 方法的参数
	 */
	//@Before("execution(public int com.zsrt.javaweb.ch01.ArithmeticCalculateImpl.add(int, int))")
	//@Before("execution(private int com.zsrt.javaweb.ch01.ArithmeticCalculateImpl.*(int, int))")
	//@Before("execution(* com.zsrt.javaweb.ch01.ArithmeticCalculateImpl.*(int, int))")
	//@Before("execution(* com.zsrt.javaweb.ch01.*.*(int, int))")
	@Before("execution(* com.zsrt.javaweb.ch01.*.*(..))")
	public void invokeBeforeMethod(JoinPoint jp){
		Signature sign = jp.getSignature();
		
		//得到方法的名字
		String name = sign.getName();
		
		//得到方法的参数
		Object[] args = jp.getArgs();
		List<Object> as = Arrays.asList(args);
		System.out.println("方法"+name+"的参数是"+as);
		
		
		System.out.println("在方法之前执行的代码...");
	}

}
